package com.itheima.health.service.impl;


import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.health.entity.PageResult;
import com.itheima.health.entity.QueryPageBean;
import com.itheima.health.mapper.CheckGroupMapper;
import com.itheima.health.pojo.CheckGroup;
import com.itheima.health.service.CheckGroupService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@Transactional
public class CheckGroupServiceImpl implements CheckGroupService {
    @Autowired
    private CheckGroupMapper checkGroupMapper;

    /**
     * 新增检查组
     * @param checkGroup 检查组信息
     * @param checkItemIds 检查组的检查项
     */
    @Override
    public void add(CheckGroup checkGroup, Integer[] checkItemIds) {
        // 添加检查组
        checkGroupMapper.add(checkGroup);

        // 在中间表中指定检查组中包含的检查项
        setCheckGroupAndCheckItem(checkGroup.getId(), checkItemIds);
    }

    /**
     * 在中间表插入检查组id和检查项的id,形成关联
     * @param checkGroupId 检查组id
     * @param checkItemIds 检查组对应的所有检查项
     */
    public void setCheckGroupAndCheckItem(Integer checkGroupId, Integer[] checkItemIds) {
        if (checkItemIds == null || checkItemIds.length == 0) {
            System.out.println("用户没有选择检查项");
            return;
        }

        // 遍历得到每个检查项id
        for (Integer checkItemId : checkItemIds) {
            // 调用mapper往数据新增一个检查组id和一个检查项id
            checkGroupMapper.setCheckGroupAndCheckItem(checkGroupId, checkItemId);
        }
    }
    /**
     * 检查组分页查询
     * @param queryPageBean 前端提交过来的分页查询参数
     * @return 分页查询结果
     */
    @Override
    public PageResult findPage(QueryPageBean queryPageBean){
        // 1.使用分页插件开始分页
        PageHelper.startPage(queryPageBean.getCurrentPage(), queryPageBean.getPageSize());
        // 2.调用Mapper分页查询
        Page<CheckGroup> page = checkGroupMapper.findPage(queryPageBean.getQueryString());
        return new PageResult(page.getTotal(), page.getResult());
    }
    /**
     * 根据id查询检查组
     * @param id 检查组id
     * @return 检查组数据
     */
    @Override
    public CheckGroup findById(Integer id) {
        // 1.调用Mapper根据id查询检查组
        CheckGroup checkGroup = checkGroupMapper.findById(id);

        // 2.返回检查组对象
        return checkGroup;
    }

    /**
     * 根据检查组id查询对应的所有检查项id
     * @param checkGroupId 检查组id
     * @return 检查组合的所有检查项id
     */
    @Override
    public List<Integer> findCheckItemIdsByCheckGroupId(Integer checkGroupId) {
        // 1.调用Mapper根据检查组id查询对应的所有检查项id
        List<Integer> checkItemIds = checkGroupMapper.findCheckItemIdsByCheckGroupId(checkGroupId);

        // 2.返回检查组合的所有检查项id
        return checkItemIds;
    }

    /**
     * 编辑检查项
     *
     * @param checkGroup   检查组数据
     * @param checkItemIds
     */
    @Override
    public void edit(CheckGroup checkGroup, Integer[] checkItemIds) {
        // 1.调用Mapper 编辑检查组
        checkGroupMapper.edit(checkGroup);

        // 2.调用Mapper 根据检查组id删除中间表数据（清理原有关联关系）
        checkGroupMapper.deleteAssociation(checkGroup.getId());

        // 3.调用Mapper在中间表中添加检查组中包含的检查项
        setCheckGroupAndCheckItem(checkGroup.getId(), checkItemIds);
    }
    /**
     * 查询所有检查组
     * @return 所有检查组数据
     */
    @Override
    public List<CheckGroup> findAll() {
        // 1.调用mapper 查询所有检查组
        List<CheckGroup> checkGroups = checkGroupMapper.findAll();
        // 2.返回所有检查组
        return checkGroups;
    }
    /**
     * 删除检查组
     * @param id 检查组id
     */
    @Override
    @Transactional
    public void delete(Integer id) {
        // 先删除关联表中的数据
        checkGroupMapper.deleteAssociation(id);

        // 再删除检查组数据
        checkGroupMapper.delete(id);
    }

}